home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 4 / Apprentice-Release4.iso / Languages / MacQForth 1.0 / source / QF Source / QFORTH.S < prev   
Text File  |  1995-03-06  |  25KB  |  649 lines

  1. utines
  2. ********************************
  3.  
  4. *
  5. * Initialize stacks
  6. *
  7.  
  8. INITSTACKS
  9.  LDA #$FF ; Initialize data stack
  10.  STA DATSTACK ; Initialize data stack
  11.  STZ DATITEMS
  12.  
  13.  STA RETSTACK ; Initalize runtime return stack
  14.  STZ RETITEMS
  15.  
  16.  STA CMPSTACK ; Initialize compiler stacks
  17.  STA CM2STACK
  18.  STZ CMPITEMS
  19.  STZ CM2ITEMS
  20.  RTS
  21.  
  22. *
  23. * Push number onto compiler stack
  24. *
  25.  
  26. PUSHCOMP TXA
  27.  LDX CMPSTACK
  28.  STA COMPAREA,X
  29.  DEX
  30.  TYA
  31.  STA COMPAREA,X
  32.  DEX
  33.  STX CMPSTACK
  34.  INC CMPITEMS
  35.  BEQ :ERROR
  36.  RTS
  37.  
  38. :ERROR LDA #01
  39.  JMP PRTERR
  40.  
  41. *
  42. * Pop number from compiler stack
  43. *
  44.  
  45. POPCOMP LDA CMPITEMS
  46.  BEQ :ERROR
  47.  DEC CMPITEMS
  48.  LDX CMPSTACK
  49.  INX
  50.  LDA COMPAREA,X
  51.  TAY
  52.  INX
  53.  STX CMPSTACK
  54.  LDA COMPAREA,X
  55.  TAX
  56.  RTS
  57.  
  58. :ERROR LDA #02
  59.  JMP PRTERR
  60.  
  61. *
  62. * Push number onto compiler stack 2
  63. *
  64.  
  65. PUSHCMP2 TXA
  66.  LDX CM2STACK
  67.  STA CMP2AREA,X
  68.  DEX
  69.  TYA
  70.  STA CMP2AREA,X
  71.  DEX
  72.  STX CM2STACK
  73.  INC CM2ITEMS
  74.  BEQ :ERROR
  75.  RTS
  76.  
  77. :ERROR LDA #01
  78.  JMP PRTERR
  79.  
  80. *
  81. * Pop number from compiler stack 2
  82. *
  83.  
  84. POPCMP2 LDA CM2ITEMS
  85.  BEQ :ERROR
  86.  DEC CM2ITEMS
  87.  LDX CM2STACK
  88.  INX
  89.  LDA CMP2AREA,X
  90.  TAY
  91.  INX
  92.  STX CM2STACK
  93.  LDA CMP2AREA,X
  94.  TAX
  95.  RTS
  96.  
  97. :ERROR LDA #02
  98.  JMP PRTERR
  99.  
  100. *
  101. * Push number onto data stack
  102. *
  103.  
  104. PUSHDATA TXA
  105.  LDX DATSTACK
  106.  STA DATAAREA,X
  107.  DEX
  108.  TYA
  109.  STA DATAAREA,X
  110.  DEX
  111.  STX DATSTACK
  112.  INC DATITEMS
  113.  BEQ :ERROR
  114.  RTS
  115.  
  116. :ERROR LDA #03
  117.  JMP PRTERR
  118.  
  119. *
  120. * Pop number from data stack
  121. *
  122.  
  123. POPDATA LDA DATITEMS
  124.  BEQ :ERROR
  125.  DEC DATITEMS
  126.  LDX DATSTACK
  127.  INX
  128.  LDA DATAAREA,X
  129.  TAY
  130.  INX
  131.  STX DATSTACK
  132.  LDA DATAAREA,X
  133.  TAX
  134.  RTS
  135.  
  136. :ERROR LDA #04
  137.  JMP PRTERR
  138.  
  139. *
  140. * Push number onto return stack
  141. *
  142.  
  143. PUSHRETN TXA
  144.  LDX RETSTACK
  145.  STA RETNAREA,X
  146.  DEX
  147.  TYA
  148.  STA RETNAREA,X
  149.  DEX
  150.  STX RETSTACK
  151.  INC RETITEMS
  152.  BEQ :ERROR
  153.  RTS
  154.  
  155. :ERROR LDA #05
  156.  JMP PRTERR
  157.  
  158. *
  159. * Pop number from return stack
  160. *
  161.  
  162. POPRETN LDA RETITEMS
  163.  BEQ :ERROR
  164.  DEC RETITEMS
  165.  LDX RETSTACK
  166.  INX
  167.  LDA RETNAREA,X
  168.  TAY
  169.  INX
  170.  STX RETSTACK
  171.  LDA RETNAREA,X
  172.  TAX
  173.  RTS
  174.  
  175. :ERROR LDA #06
  176.  JMP PRTERR
  177.  
  178. ********************************
  179. * End stack manipulation subroutines
  180. ********************************
  181.  
  182. ********************************
  183. * Start compiler output management subroutines
  184. ********************************
  185.  
  186. *
  187. * Set compiler output to scratchpad immediate object area
  188. *
  189.  
  190. SETSCR LDA #CSCRATCH
  191.  STA COUTPUT
  192.  LDA #/CSCRATCH
  193.  STA COUTPUT+1
  194.  RTS
  195.  
  196. *
  197. * Set compiler output to end-of-system
  198. *
  199.  
  200. SETCEOS LDA EOSPNTR
  201.  STA COUTPUT
  202.  LDA EOSPNTR+1
  203.  STA COUTPUT+1
  204.  RTS
  205.  
  206. *
  207. * Set end of system to compiler otuput
  208. *
  209.  
  210. SETEOSC LDA COUTPUT
  211.  STA EOSPNTR
  212.  LDA COUTPUT+1
  213.  STA EOSPNTR+1
  214.  RTS
  215.  
  216. *
  217. * Output compiler data
  218. *
  219.  
  220. OUTBYTE STA (COUTPUT)
  221.  INC COUTPUT
  222.  BNE :SKIPINC
  223.  INC COUTPUT+1
  224. :SKIPINC RTS
  225.  
  226. ********************************
  227. * End compiler output management subrotuines
  228. ********************************
  229.  
  230. ********************************
  231. * Start vocabulary maintenance subroutines
  232. ********************************
  233.  
  234. *
  235. * Linked list node consists of four bytes:
  236. *
  237. * (Word pointer to next node, null if tail node) +
  238. * (word pointer to text)
  239. *
  240.  
  241. *
  242. * Clear vocabulary
  243. *
  244.  
  245. CLRVOCAB LDX #$7F
  246. :LOOP STZ HASHTBLL,X
  247.  STZ HASHTBLH,X
  248.  DEX
  249.  BPL :LOOP
  250.  
  251.  LDA #LINKLIST
  252.  STA LISTPNTR
  253.  LDA #/LINKLIST
  254.  STA LISTPNTR+1
  255.  
  256.  RTS
  257.  
  258. *
  259. * Calculate hash value of word at (WORDPNTR)
  260. *
  261.  
  262. CALCHASH LDA WORDPNTR
  263.  STA PNTR
  264.  LDA WORDPNTR+1
  265.  STA PNTR+1
  266.  
  267. CALCHSH2 STZ HASH
  268.  LDY #$00
  269.  LDA (PNTR),Y
  270. :LOOP EOR HASH
  271.  STA HASH
  272.  INY
  273.  LDA (PNTR),Y
  274.  CMP #' '
  275.  BEQ :FINIS
  276.  CMP #$0D
  277.  BNE :LOOP
  278.  
  279. :FINIS LDA HASH
  280.  AND #$7F
  281.  STA HASH
  282.  RTS
  283.  
  284. *
  285. * See if word at (WORDPNTR) already exists
  286. *
  287. * Note: CALCHASH must be called before CHKWORD
  288. *
  289.  
  290. CHKWORD LDY HASH
  291.  LDA HASHTBLL,Y ; See if first link exists
  292.  ORA HASHTBLH,Y
  293.  BNE :CHECK
  294.  
  295.  CLC ; First link doesn't exist
  296.  RTS ;   so word isn't in vocabulary
  297.  
  298. :CHECK LDA HASHTBLL,Y ; Fetch pointer to linked list
  299.  STA PNTR
  300.  LDA HASHTBLH,Y
  301.  STA PNTR+1
  302.  
  303.  LDY #$01
  304.  
  305. :OUTER INY ; Fetch pointer to text
  306.  LDA (PNTR),Y
  307.  STA PNTR2
  308.  INY
  309.  LDA (PNTR),Y
  310.  STA PNTR2+1
  311.  
  312.  LDY #$FF ; See if texts are identical
  313. :INNER INY
  314.  LDA (PNTR2),Y
  315.  CMP #' '
  316.  BEQ :END?
  317.  CMP (WORDPNTR),Y
  318.  BEQ :INNER
  319.  
  320.  BRA :NEXT
  321.  
  322. :END? LDA (WORDPNTR),Y
  323.  CMP #' '
  324.  BEQ :FOUND
  325.  CMP #$0D
  326.  BEQ :FOUND
  327.  
  328. :NEXT LDA (PNTR) ; See if pointer to next node exists
  329.  TAX
  330.  LDY #$01
  331.  LDA (PNTR),Y
  332.  STX PNTR
  333.  STA PNTR+1
  334.  ORA PNTR
  335.  BNE :OUTER
  336.  
  337.  CLC ; Word not in vocabulary
  338.  RTS
  339.  
  340. :FOUND INY ; Found, so leave address of routine in
  341.  LDA (PNTR2),Y ;    PNTR and set carry
  342.  STA PNTR
  343.  INY
  344.  LDA (PNTR2),Y
  345.  STA PNTR+1
  346.  
  347.  RTS
  348.  
  349. *
  350. * Add word to vocabulary
  351. *
  352. * Note: CALCHASH must be called before ADDWORD
  353. *
  354.  
  355. ADDWORD LDY HASH ; See if there is initial pointer
  356.  LDA HASHTBLL,Y
  357.  ORA HASHTBLH,Y
  358.  BNE :TRAVERS
  359.  
  360.  LDA LISTPNTR ; Create initial pointer
  361.  STA HASHTBLL,Y
  362.  LDA LISTPNTR+1
  363.  STA HASHTBLH,Y
  364.  LDY #$01
  365.  BRA :CREATE
  366.  
  367. :TRAVERS LDA HASHTBLL,Y ; Must traverse linked list to find
  368.  STA PNTR ;   tail node to tack new node onto
  369.  LDA HASHTBLH,Y
  370.  STA PNTR+1
  371.  
  372.  LDY #$01
  373.  
  374. :LOOP LDA (PNTR)
  375.  TAX
  376.  ORA (PNTR),Y
  377.  BEQ :TAILFND
  378.  
  379.  LDA (PNTR),Y
  380.  STA PNTR+1
  381.  STX PNTR
  382.  BRA :LOOP
  383.  
  384. :TAILFND LDA LISTPNTR
  385.  STA (PNTR)
  386.  LDA LISTPNTR+1
  387.  STA (PNTR),Y
  388.  
  389. :CREATE LDA #$00 ; Pointer to next node = null
  390.  STA (LISTPNTR)
  391.  STA (LISTPNTR),Y
  392.  LDA PNTR3
  393.  INY
  394.  STA (LISTPNTR),Y
  395.  LDA PNTR3+1
  396.  INY
  397.  STA (LISTPNTR),Y
  398.  
  399.  LDA LISTPNTR ; Move list pointer to next free space
  400.  CLC
  401.  ADC #$04
  402.  STA LISTPNTR
  403.  BCC :SKIPINC
  404.  INC LISTPNTR+1
  405.  
  406. :SKIPINC RTS
  407.  
  408. *
  409. * Forget last defined word
  410. *
  411.  
  412. FRGTLAST LDA LISTPNTR ; Throw away last node
  413.  SEC
  414.  SBC #$04
  415.  STA LISTPNTR
  416.  BCS :SKIPDEC
  417.  DEC LISTPNTR+1
  418.  
  419. :SKIPDEC LDY #$02 ; Set up pointer to word text
  420.  LDA (LISTPNTR),Y
  421.  STA PNTR
  422.  INY
  423.  LDA (LISTPNTR),Y
  424.  STA PNTR+1
  425.  
  426.  JSR CALCHSH2 ; Calculate hash value
  427.  
  428.  LDX HASH ; Is it initial pointer?
  429.  LDA HASHTBLL,X
  430.  STA PNTR
  431.  TAY
  432.  LDA HASHTBLH,X
  433.  STA PNTR+1
  434.  CMP LISTPNTR+1
  435.  BNE :TRAVERS
  436.  CPY LISTPNTR
  437.  BNE :TRAVERS
  438.  
  439.  STZ HASHTBLL,X ; Easy to kill initial pointer
  440.  STZ HASHTBLH,X
  441.  RTS
  442.  
  443. :TRAVERS LDY #$01 ; Check against next node
  444. :LOOP LDA (PNTR)
  445.  TAX
  446.  LDA (PNTR),Y
  447.  CMP LISTPNTR+1
  448.  BNE :GONEXT
  449.  CPX LISTPNTR
  450.  BNE :GONEXT
  451.  
  452.  LDA #$00 ; Kill this link
  453.  STA (PNTR)
  454.  STA (PNTR),Y
  455.  RTS
  456.  
  457. :GONEXT STX PNTR ; Go to next node
  458.  STA PNTR+1
  459.  BRA :LOOP
  460.  
  461. *
  462. * List all words
  463. *
  464.  
  465. LISTWRDS LDA #$8D ; Skip a line for neatness
  466.  JSR COUT
  467.  
  468.  LDA #LINKLIST ; Start at beginning of list
  469.  STA PNTR
  470.  LDA #/LINKLIST
  471.  STA PNTR+1
  472.  
  473.  LDA #$05 ; Five words per line (4 to 0)
  474.  STA TEMP
  475.  
  476. :OUTER LDY #$02 ; Fetch pointer to word name
  477.  LDA (PNTR),Y
  478.  STA PNTR2
  479.  INY
  480.  LDA (PNTR),Y
  481.  STA PNTR2+1
  482.  
  483.  LDX #16 ; Print word name
  484.  LDY #$00
  485. :INNER LDA (PNTR2),Y
  486.  CMP #$20
  487.  BEQ :ENDTEXT
  488.  CMP #$0D
  489.  BEQ :ENDTEXT
  490.  JSR COUT
  491.  INY
  492.  DEX
  493.  BRA :INNER
  494.  
  495. :ENDTEXT TXA ; Justify it to 16 characters
  496.  BMI :NEXTWRD
  497.  BEQ :NEXTWRD
  498. :TINY LDA #' '
  499.  JSR COUT
  500.  DEX
  501.  BNE :TINY
  502.  
  503. :NEXTWRD LDA PNTR ; Move PNTR to next node
  504.  CLC
  505.  ADC #$04
  506.  STA PNTR
  507.  BCC :SKIPINC
  508.  INC PNTR+1
  509.  
  510. :SKIPINC DEC TEMP
  511.  BNE :NORESET
  512.  
  513.  LDA KYBD ; Check for ctrl-S
  514.  BIT STROBE
  515.  CMP #$93
  516.  BNE :NOTPAUS
  517. :PAUSE LDA KYBD
  518.  BPL :PAUSE
  519.  BIT STROBE
  520.  
  521. :NOTPAUS LDA #$05
  522.  STA TEMP
  523.  
  524. :NORESET LDA PNTR ; See if we're at end of list yet
  525.  CMP LISTPNTR
  526.  BNE :OUTER
  527.  LDA PNTR+1
  528.  CMP LISTPNTR+1
  529.  BNE :OUTER
  530.  
  531.  LDA TEMP ; If we're at end of line, no <CR>
  532.  CMP #$05 ;   otherwise one <CR>s
  533.  BEQ :NOCR
  534.  LDA #$8D
  535.  JMP COUT
  536. :NOCR RTS
  537.  
  538. *
  539. * Load default system words
  540. *
  541.  
  542. LOADWRDS JSR CLRVOCAB
  543.  
  544.  LDA #SYSWORDS
  545.  STA PNTR4
  546.  LDA #/SYSWORDS
  547.  STA PNTR4+1
  548.  
  549. :LOOP LDA (PNTR4)
  550.  STA WORDPNTR
  551.  STA PNTR3
  552.  LDY #$01
  553.  LDA (PNTR4),Y
  554.  STA WORDPNTR+1
  555.  STA PNTR3+1
  556.  ORA WORDPNTR
  557.  BEQ :FINIS
  558.  
  559.  JSR CALCHASH
  560.  JSR ADDWORD
  561.  
  562.  LDA PNTR4
  563.  CLC
  564.  ADC #$02
  565.  STA PNTR4
  566.  BCC :LOOP
  567.  INC PNTR4+1
  568.  BRA :LOOP
  569.  
  570. :FINIS RTS
  571.  
  572. SYSWORDS DW WORD1
  573.  DW WORD2
  574.  DW WORD3
  575.  DW WORD4
  576.  DW WORD5
  577.  DW WORD6
  578.  DW WORD7
  579.  DW WORD8
  580.  DW WORD9
  581.  DW WORD10
  582.  DW WORD11
  583.  DW WORD12
  584.  DW WORD13
  585.  DW WORD14
  586.  DW WORD15
  587.  DW WORD16
  588.  DW WORD17
  589.  DW WORD18
  590.  DW WORD19
  591.  DW WORD20
  592.  DW WORD21
  593.  DW WORD22
  594.  DW WORD23
  595.  DW WORD24
  596.  DW WORD25
  597.  DW WORD26
  598.  DW WORD27
  599.  DW WORD28
  600.  DW WORD29
  601.  DW WORD30
  602.  DW WORD31
  603.  DW WORD32
  604.  DW WORD33
  605.  DW WORD34
  606.  DW WORD35
  607.  DW WORD36
  608.  DW WORD37
  609.  DW WORD38
  610.  DW WORD39
  611.  DW WORD40
  612.  DW WORD41
  613.  DW WORD42
  614.  DW WORD43
  615.  DW WORD44
  616.  DW WORD45
  617.  DW WORD46
  618.  DW WORD47
  619.  DW WORD48
  620.  DW WORD49
  621.  DW WORD50
  622.  DW WORD51
  623.  DW WORD52
  624.  DW WORD53
  625.  DW WORD54
  626.  DW WORD55
  627.  DW WORD56
  628.  DW WORD57
  629.  DW WORD58
  630.  DW WORD59
  631.  DW WORD60
  632.  DW WORD61
  633.  DW WORD62
  634.  DW WORD63
  635.  DW WORD64
  636.  DW WORD65
  637.  DW WORD66
  638.  DW WORD67
  639.  DW WORD68
  640.  DW WORD69
  641.  DW WORD70
  642.  DW WORD71
  643.  DW WORD72
  644.  DW WORD73
  645.  DW WORD74
  646.  DW WORD75
  647.  DW WORD76
  648.  DW WORD77
  649.